package com.hnqc.hsl;

import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Client {
    private DefaultListModel dt;
    private JTextArea jta;
    private JTextField jtf_message = new JTextField();
    private JTextField jtf_port = new JTextField("4567");
    private JTextField jtf_max = new JTextField("30");
    private JButton jbt1_start = new JButton("连接");
    private JButton jbt2_stop = new JButton("停止");
    private JButton jbt3_send = new JButton("发送");
    private List<Socket> list=new ArrayList<>();

    //非静态方法如何调用？  对象.
    public void createUI() {
        JFrame jf = new JFrame("客户端");
        jf.setBounds(200, 200, 500, 300);
        //1、北边JPanel
        JPanel northPane = new JPanel();
        northPane.setLayout(new GridLayout(1, 6));
        northPane.add(new JLabel("人数上限"));
        northPane.add(jtf_max);
        northPane.add(new JLabel("端口"));
        northPane.add(jtf_port);
        northPane.add(jbt1_start);

        jbt2_stop.setEnabled(false);
        northPane.add(jbt2_stop);
        northPane.setBorder(new TitledBorder("配置信息"));
        //2、中间JPanel（分左右两栏）
        //左栏
        dt = new DefaultListModel();
        final JList jl = new JList();
        JScrollPane leftpane = new JScrollPane(jl);
        leftpane.setBorder(new TitledBorder("在线用户"));
        //右栏
        jta = new JTextArea();
        jta.setEditable(false);
        JScrollPane rightpane = new JScrollPane(jta);
        rightpane.setBorder(new TitledBorder("消息显示区"));
        JSplitPane centerPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftpane, rightpane);
        //设置分隔条的大小
        centerPane.setDividerSize(20);
        //设置分隔条的位置
        centerPane.setDividerLocation(100);
        //3、南部JPanel
        JPanel southPanel = new JPanel(new BorderLayout());
        southPanel.setBorder(new TitledBorder("写消息"));
        southPanel.add(jtf_message, BorderLayout.CENTER);

        jf.setLayout(new BorderLayout());
        jf.add(northPane, BorderLayout.NORTH);
        jf.add(centerPane, BorderLayout.CENTER);
        jf.add(southPanel, BorderLayout.SOUTH);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        clientEvent();

    }

    private void clientEvent() {
        jbt1_start.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Socket socket = new Socket("localhost", 9999);

                        /* while (true) {
                                InputStream   in = socket.getInputStream();
                                BufferedReader bu = new BufferedReader(new InputStreamReader(in));
                                String s = bu.readLine();
                                jta.append(s);
                            }*/
                            ClientRunnableThread c=new ClientRunnableThread(socket);
                            new Thread(c).start();
                            Clientwrite c1=new Clientwrite(socket);
                            new Thread(c1).start();
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }
                    }
                }).start();
            }
        });

    }

    class ClientRunnableThread implements Runnable{
        private Socket socket;
        public ClientRunnableThread(Socket socket){
            this.socket=socket;
        }
        @Override
        public void run() {
            try {
                while (true){
                    InputStream in=socket.getInputStream();
                    BufferedReader bu = new BufferedReader(new InputStreamReader(in));
                    String s = bu.readLine();
                    jta.append(s+"\n");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    class Clientwrite implements Runnable{
        private Socket socket;
        public Clientwrite(Socket socket){
            this.socket=socket;
        }
        @Override
        public void run() {
            jtf_message.addKeyListener(new KeyAdapter() {
                public void keyPressed(KeyEvent e) {
                    if(e.getKeyChar()==KeyEvent.VK_ENTER){
                        try {
                            OutputStream out=socket.getOutputStream();
                            PrintStream pr=new PrintStream(out);
                            pr.println(jtf_message.getText());
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }
                    }
                }
            });
        }
    }
    public static void main(String[] args) {
        new Client().createUI();
    }
}